/**
 ****************************************
 * @file usart_data_packet_analysis_app.h
 * @author: AnRui
 * @version 0.1
 * @date  : 2025-06-20
 * @copyright Copyright (c) 2025
 * @desc:  根据协议解析数据并处理 分为数据获取,数据暂存以及管理,数据处理3个部分:
 *
 *         协议包格式规定:
 *                       帧头0  帧头1    数据长度   功能字     ..  异或校验数据(XOR8)
 *                       0x55   0xAA     0x--      0x--      ..    0x--
 *                       例如: 控制led亮灭数据包
 *                            0x55   0xAA     0x03   0x06(led功能字,数据1)  0x01(led编号,数据2)   0x01(led亮,数据3)  0x25(异或校验位)
 *         数据获取部分:
 *              外部 调用 DataPacketGetData 函数。该函数会把数据放到协议解析的暂存区中。
 *              注意:默认状态下的暂存区可以保存7-11个包数据,如果暂存区满了 数据就会保存失败。
 *
 *         数据暂存区:
 *              内部定义了一个rcvDataBuf的uint8_t的数组 用来做数据暂存区。
 *              长度为MAX_BUF_SIZE 默认值为77。
 *              同时为了配合暂存区,我们要求协议包数据的长度在7-11bit之间。这个缓冲区就可以包含7-11个完整的包数据。
 *
 *         数据暂存区管理:
 *              内部使用队列来管理暂存区,利用队列先进先出的特点,先处理最先到来的数据。
 *              使用队列的push和pop函数 来把放入或提取数据包。
 *
 *         数据协议解析:
 *              调用DataPacketProtocolAnalysis函数,内部会不断地从队列中读取数据包并根据对应的内容来执行对应的操作,知道所有的数据包数都解析完。
 *              注意: 默认的暂存区最多可以保存7-11个包数据。
 *                   假设发送每个包的时间间隔为200ms  最多1400ms就必须解析 要不后来的数据就进入不了缓冲区啦
 *
 *
 *
 * ***************************************
 */
#ifndef __DATA_PACKET_ANALYSIS_APP_H__
#define __DATA_PACKET_ANALYSIS_APP_H__
#include "gd32f30x.h"
#include <stdbool.h>
#include "usart_drv.h"
#include "led_drv.h"
#include "circular_queue.h"

 /******************************数据包************************************/
#define FRAME_HEAD_0                 0x55       // 数据包针头0,值规定
#define FRAME_HEAD_1                 0xAA       // 数据包针头1,值规定
#define PACKET_DATA_LEN_MIN          7          //最小包长度
#define PACKET_DATA_LEN_MAX          11         //最大包长度
#define FUNC_DATA_IDX                3          // 数据包中功能字符下标  
#define PACKET_Auxiliary_DATA_LEN    4          // 数据包中辅助数据的数量  针头0+针头1+数据长度+校验位

/******************************缓冲区**************************************/
#define MAX_BUF_SIZE                 77         // 缓冲区大小 最好是数据包的整数倍

/******************************函数***************************************/

 /**
  * @desc  : 协议解析初始化
  * @date  : 2025-03-26
  * @author: AnRui
  * @note  : 在usart中注册自己的数据接收函数
  *          当usart接收到数据时会把数据放到自己的缓冲区中,为接下来解析做准备
  */
void DataPacketProtocolAnalysisInit(void);

/**
 * @desc  : 数据包解析
 * @date  : 2025-03-26
 * @author: AnRui
 * @note  :
 */
void DataPacketProtocolAnalysis(void);


/**
 * @desc  : 接收数据并保存到暂存区中
 * @date  : 2025-06-20
 * @author: AnRui
 * @param : data - {参数说明}: 数据指针
 * @param : len - {参数说明}:  数据长度
 * @note  : 检测数据的长度是否符合要求,并将符合要求的数据放到暂存区(队列)中
 */
void DataPacketGetData(uint8_t* data, uint32_t len);

#endif
